﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using DataAccessComponents;
using System.Collections.ObjectModel;
using System.Windows;

namespace BusinessLogicLayer
{
    public class PracownikBL : IBusinessLogicLayer<Pracownik>
    {
        private DbOperations dal = new DbOperations();

        /// <summary>
        /// Funkcja dodawająca pracownik do bazy danych
        /// </summary>
        /// <param name="objectDodaj">Obiekt Pracownik</param>
        /// <returns></returns>
        public int dodaj(Pracownik objectDodaj)
        {
            AdresBL adresBL = new AdresBL();
            objectDodaj.Id_adres = adresBL.dodaj(objectDodaj.Adres);

            return dal.dodajPracownik(objectDodaj);
        }

        /// <summary>
        /// Funkcja usuwająca pracownik z bazy danych
        /// </summary>
        /// <param name="idusun">Id pracownik do usunięcia</param>
        public void usun(int idusun)
        {
            AdresBL adresBL = new AdresBL();
            Pracownik prac = this.pobierz(idusun);
            adresBL.usun(prac.Id_adres);

            dal.usunPracownik(idusun);
        }

        /// <summary>
        /// Funkcja akutualizująca pracownik w bazie danych
        /// </summary>
        /// <param name="objAktualizuj">Obiekt pracownik zawierający inforamacje do aktualizacji</param>
        public void aktualizuj(Pracownik objAktualizuj)
        {
            AdresBL adresBL = new AdresBL();
            adresBL.aktualizuj(objAktualizuj.Adres);

            dal.aktualizujPracownik(objAktualizuj);
        }

        /// <summary>
        /// Pobiera pracownik na podstawie id pracownik
        /// </summary>
        /// <param name="idpobierz">Id pracownik</param>
        /// <returns>Obiekt Pracownik</returns>
        public Pracownik pobierz(int idpobierz)
        {
            AdresBL adresBL = new AdresBL();
            Pracownik prac = dal.pobierzPracownik(idpobierz);
            prac.Adres = adresBL.pobierz(prac.Id_adres);

            return prac;
        }

        public ObservableCollection<Pracownik> pobierzListe()
        {

            ObservableCollection<Pracownik> pracownicy = dal.pobierzListePracownikow();
            AdresBL adresBL = new AdresBL();
            foreach (Pracownik prac in pracownicy)
            {
                prac.Adres = adresBL.pobierz(prac.Id_adres);
            }

            return pracownicy;
        }

        /// <summary>
        /// Funkcja aktualizuje pozycje pracowników na podstawie listy pracownikow
        /// </summary>
        /// <param name="lista"></param>
        /// <returns></returns>
        public bool aktualizujListe(ObservableCollection<Pracownik> lista)
        {
            
            AdresBL adresBL = new AdresBL();
            foreach (Pracownik prac in lista)
            {
                // aktualizacja danych pracownika
                aktualizuj(prac);
                //aktualizacja adresu pracownika
                adresBL.aktualizuj(prac.Adres);
            }
            return true;
        }

        /// <summary>
        /// Funkcja usuwa pozycje pracowników na podstawie listy pracownikow do usunięcia
        /// </summary>
        /// <param name="lista"></param>
        /// <returns></returns>
        public bool usun(ObservableCollection<Pracownik> lista)
        {
            foreach (Pracownik prac in lista)
            {
                usun(prac.Id_pracownik);             
            }
            return true;
        }

        public int loguj(string email,string haslo)
        {
            ObservableCollection<Pracownik> lista = this.pobierzListe();
            foreach (Pracownik pracownik in lista)
            {
                if (pracownik.Email.Equals(email) && pracownik.Haslo.Equals(GetMd5Hash(haslo)) && !string.IsNullOrEmpty(pracownik.Haslo))
                {
                    if (pracownik.Czy_zablokowany == true)
                    {
                        return -1;
                    }else
                        return pracownik.Id_pracownik;
                }                           
            }
            return 0;
        }
        private string GetMd5Hash(string input)
        {
            System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] bs = Encoding.UTF8.GetBytes(input);
            bs = x.ComputeHash(bs);

            StringBuilder sb = new StringBuilder();
            foreach (byte b in bs)
            {
                sb.Append(b.ToString("x2").ToLower());
            }
            return sb.ToString();
        }
     
    }
}
